精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
需求汇总如下:
这样的需求在系统技术架构上要求有可扩展性,以支持业务规模增加后,并发量显著增长要求。
现在云计算技术成熟,可以以云计算平台来支持扩展。阿里云是国内成熟的平台。这里介绍下它的技术特点:
聚石塔是天猫和阿里云联合推出的以云计算为底层,为电商和各类电商服务商提供IT基础设施和数据服务的平台。这也是阿里的云计算技术在电子商务领域首次大规模的实战,有效的证明了云计算在应对电商业务挑战的能力。
云计算的核心价值之一是为客户解决了构建大规模分布式系统的难题。云计算的服务提供了足够大的计算能力和存储能力,任何客户都能10分钟之内获得10000个CPU core的计算能力,10P的存储能力,正是因为云计算产品在计算和存储方面的巨大能力,电商的软件系统才能在双11期间从容应对50倍的访问量增长。
云计算的核心价值之二是使得用户的整体成本大幅降低,客户不需要为峰值流量配备闲置的资源,随时可以释放掉不使用的资源。再加上阿里云是按照资源的实际使用来收取费用,大大降低了用户的整体成本。电商不再需要采购几十倍的服务器和带宽,只要在双11那天,临时调高云计算产品和服务的一些配置,过了双11再调下来,这样只需要为1天的峰值访问支付成本。
总的来说,就是阿里云云计算提供了足够大的计算能力和存储能力的同时,只按照实际使用的资源来收费,为电商在双11类似的促销活动中从容应对访问量的暴涨且费用低廉。
对于中小规模的互联网企业和电商企业而言,建设自己的IT系统,会是不小的成本。阿里云的云计算价值在于,可以提供统一的解决方案,让电商和更多中小企业在云计算平台上部署应用,通过阿里云的统一运维、云平台的安全机制来保障系统的稳定和安全。
如何使用阿里云云计算产品来构建电商系统
阿里云目前可以为电商提供完整的解决方案,目前的产品线分为两大类别:弹性计算和大规模存储。
弹性计算产品包括云服务器ECS、负载均衡服务SLB、云监控、云盾。ECS和SLB一起为用户提供了弹性的计算能力,云监控帮助客户更好的认识服务的运行状况,云盾是个安全产品,使得客户的服务更加安全。
大规模存储产品包括关系型数据库服务RDS、开放存储服务OSS、开放结构化存储服务OTS。RDS适合存储传统关系型数据,OSS适合存储key-value形式的数据,OTS适合存储海量的单表数据。
基于上述产品和服务,电商客户通常可以采取如下的方式构建自己的互联网服务,如下图所示:
1、SLB是对外的访问入口,提供了扩充计算能力的功能,通过设置虚拟IP,将位于同一数据中心的多台云服务器资源虚拟成一个高性能、高可用的应用服务池,再根据应用特性,将来自客户端的网络请求分发的云服务器池中,同时SLB还起到增强云服务器池抗攻击能力的作用。SLB是个调度者,它能够协调同组的服务器,协调的动作里最典型的是,找不忙碌的服务器来对新的点击请求应答,当然还有其它动作。
2、HTTP 应用服务集群基于SLB和ECS来构建,当流量增长迅速的时候,增加更多的ECS节点到SLB中即可,再大的流量也不怕。
3、经常需要更新的结构化数据存储在RDS中,RDS的底层使用ssd+fushionio的硬件设备,能应对5万级别的iops,轻松应对数据库的访问压力
4、不需要经常更新的图片、视频、文件等静态内容存储到OSS中,OSS提供了10PB级别的存储能力,无需担心数据量的增长。
5、RDS,OSS,SLB的最大网络带宽可以达到几百Gbps,ECS的网络带宽也可以在管理控制台动态的调整,网络带宽不够用的情况可以迅速解决。
J2EE是Sun公司所颁布的标准,但已广为工业界所接受,J2EE的出现标志着用Java开发企业级应用系统已变得非常成熟。
体系结构
如图所示,J2EE是多层的分布式体系结构,使系统的操作和运行具有很好的灵活性。先进的 Java计算方案如面向对象、独立于平台、快速集成、代码重用等,是实现这种结构的关键,并使系统具有良好的可移植性和可扩展性。
J2EE并不限制系统采用浏览器/服务器结构或客户机/服务器结构。如果客户端是浏览器,则界面设计可以采用JSP/Servlet技术。JSP技术支持可重用的基于构件的设计,并可以与任何Web服务器或应用服务器工作。Servlet是HTTP服务器的扩展API,它提供了很强的安全策略支持,可以用来访问数据库,并动态产生查询结果页面返回给浏览器。JSP/Servlet简化了开发基于Web应用的过程,从而使得基于Java计算内核的应用程序的开发和调试变得非常容易。
J2EE还提供了多种形式的分布式对象计算环境,客户端与服务器之间以及服务器之间可以通过RMI(Remote Method Invocation)、HTTP、IIOP(Internet InterORB Protocol)、JMS(Java Messaging Service)等多种协议进行消息和数据交换。Java RMI是为分布式的异质系统之间调用而设计的Java环境, RMI支持在不同的虚拟机上对象的无缝远程调用,很好地实现了对分布式的对象模型的支持,使得分布式应用的实现变得简单,并保证了安全性。系统还可以通过IIOP存取CORBA对象。
图2.2.3-2 EJB的开发使用模型
J2EE的技术特点
适于开发企业应用
MVC模型概述
在传统的基于Web的应用业务里,例如ASP,CGI等,通常开发者将业务逻辑,数据逻辑、展示逻辑等混杂在一起,在同一个页面里既进行后台数据库的访问和操作,同时还包含业务流程和页面表示。这样编写出来的程序,既不利于程序员对业务代码的调试,同时也不利于编辑人员进行交互页面的设计。同时系统也不具备可扩展性,当我们要在现有业务上进行扩展的时候,通常无法借助于现有的资源和应用,而只能够重新编写,大大增加了投资,延长了系统上线的时间,失去了竞争市场的优势。
在电子化招标投标系统中,无论对外网站还是业务系统,都将采用通行的MVC模式来构建应用。这种结构解决了前面所述的问题,在我们的统一应用集成网络中,通过企业级高端J2EE应用服务器实现MVC开发模型。MVC的逻辑图如下:
2.2.3-3应用服务器之上采用MVC开发的逻辑示意图
图2.2.3-4MVC数据流程图
技术特点和优势
电商的主页都是以呈现为主,展示各个横向市场和纵向市场的入口,也可能会有一些个性化(所谓个性化,就是给不同的用户推荐不同的内容)的推荐。它不像交易、详情等页面,页面逻辑后端重而前端轻,后端需要做各种内容推荐、数据校验、类型判断等工作,而前端更多的是将后端的信息有序地呈现出来。
首页则不同,首页承载了大量的二级页面入口和一些频道的推荐内容,而这些数据更多的是由运营去维护,可以认为数据是死的,就算存在一些个性化的数据,也会使用 jsonp 的形式去加载,前端需要快速高效地处理这些数据,可见前端任务相当艰巨。加上作为一个网站的门面,它的安全稳定性也是极为重要的。
如果没有猜错,京东后端也有一个中间层,中间层负责组装数据,以模块为单位,根据前端的请求响应对应模块的内容,而数据是在另外一个运营平台上维护,运营填好的数据会即时的推送到 CDN 或者应用,中间层拼合数据。看不到的东西就不猜测了,我们来看看京东首页的整体结构。
前端技术简要分析
如果希望一个网站跑起来飞快,你觉得怎么做最靠谱?
我们都玩过微博,都上过手机淘宝,进入这些 app 应用,会发现很多页面几乎看不到加载的痕迹,因为他们是本地应用,很多图片、脚本、样式都已经打包在本地了,所以加载起来速度是很快的。如果希望一个网页也能飞奔起来,同样的道理,让请求的个数少一点,让请求的内容少一点。还有一个至关重要的,让那些次要的内容慢一点加载(我们称之为懒加载)。
前端缓存和异步加载
京东在按需加载和数据缓存上的工作做的十分到位。
每个具有 lazyload 异步标识的模块,都包含两个属性,一个是渲染该模块需要的内容(数据+JS),一个是这个内容过期的时间,只要内容不变就不会过期,所以这里使用的是文件 hash 来标注。
把需要请求的路径写在 dom 上,用户滚动时,一旦该模块进入了视窗,则请求 dom 上对应的 data-path 地址,拿到渲染这个模块所需要的脚本和数据,不过这中间还有一层本地缓存 localstorage,如果在本地缓存中匹配到了对应的 hash string 内容,则直接渲染,否则请求到数据之后更新本地缓存。dom 上的 data-time 会在页面加载时候,后端计算文件 hash,hash 不变则输出内容也不变。
这里其实存在两个请求,一个请求是加载数据和脚本,而这里的内容是:
为啥不在返回的内容中直接把脚本也输出出来?为了让数据充分缓存下了不少功夫。数据的变化频率比较高,如果数据和初始化脚本包装在一起,虽然节约了一个请求,但一旦数据变化,整个脚本都得重新加载,而将数据和脚本分离,脚本可以长期缓存在本地,单独请求数据,这个量会小很多。直接改变上面的 version 版本号便可以让浏览器重新请求最新脚本。
从上面可以看出,任何一个模块的改动,在前端只会引起一个较小的加载变化,加上 http 的缓存策略,服务器的压力也是很小的。
工程结构
比较常见的工程结构,如下:
.
├── build/
└── src/
├── widgets/
├── mods/
| ├── moduleA/
| | ├── index.js
| | ├── index.tpl
| | └── index.less
| ├── moduleB/
| └── moduleC/
├── index.js
├── index.tpl
└── index.less
所有 mods 中的 tpl 文件通过一些标签,引入到 src/index.tpl 中,需要同步渲染的模块信息直接引入,而异步渲染的模块内容,比如 moduleA/index.tpl,其内容就十分简单:
只引入一个模块钩子(hook),然后按需加载/懒加载这个模块钩子内容。相比 JD 采用的也是类似的模型。
横向技术对比
看看上面列出的目录结构,一般情况下,为了减少网页的请求数,我们会把所有 mods 和 wedgets 中的 js 和 css 分别打包成一个文件,然后前端 combo 请求,提前加载但是懒执行,这是 CMD 的思维方式。而京东使用了更懒的方式:懒加载并且懒执行。
这种方式带来的好处就是,单个模块的更改,前端只更新一小部分缓存;而提前加载所有模块的方式,任何一个模块有改动,整体都得重新下载。脚本懒加载的缺点是,需要发起请求,如果需要加载多个模块,则需要发起多个脚本请求,可以看到,快速拖动 JD 首页,模块的加载速度不容乐观。当然,脚本是可以被浏览器缓存的,这个问题也就是首次访问或者清空了缓存才会出现。
对请求控制如此严格,怎么就没考虑下优化源码当中的两大段 css 和 js 代码呢?是不是也可以把 css 和 js 放到 localstorage 中,减少请求数。
源码中通过函数去加载资源:
如果 localstorage 中不存在,也不需要重新发请求,后端脚本通过 cookie 判断是否需要同步输出代码:
如果发现 cookie 中的版本号与设定的版本号不一样,或者没有 cssV cookie,则同步内联输出 css 和 js。
需要实时消息组件支持,能实现即时通信功能,让异地的供应链信息能同步或可靠异步地传输到达。
开放消息服务ONS(Open Notification Service)是基于阿里开源消息中间件MetaQ(RocketMQ)打造的一款云消息产品,历经多次天猫双十一海量消息考验,在阿里巴巴内部有1000+个应用在使用,产品成熟稳定可靠, 是构建大型分布式系统的核心组件之一。它能为分布式应用系统提供异步解耦、削峰填谷能力,同时也具有海量消息堆积,高吞吐,可靠重试等互联网应用所需特性。
从2014年10月至今开始对外公测,目前ONS提供了北京,青岛,杭州三大Region的高可用集群(产品稳定性及可用性完全按照阿里巴巴内部标准来实施,无单点,99.99%的高可用性),公测期间完全免费。
目前支持Java,C++,.NET, PHP四种语言,Linux平台下支持C++,JAVA和PHP三种语言, Windows平台支持C++和.NET两种语言。
ONS是从阿里MetaQ(RocketMQ)演化而来,MetaQ在阿里各个业务线得到了广泛的应用,业务场景如下:
每天会有海量消息产生, 历经多次天猫双十一考验,稳定成熟可靠的消息产品。
同时, MetaQ 也是阿里的开源项目,开源版本名称为 RocketMQ
ONS 的主要特点
使用ONS的功能图如下示例:
具体请参考
https://docs.aliyun.com/#/pub/ons/brief-manual/overview
阿里云PTS
阿里云PTS,是阿里云面向全网用户免费开放的性能云测试平台,官方给它取了名字:Lite(PS:也不知道英文名字是怎么想出来的),主要是提供压测目标和监控集管理,包括提供简单易用的性能测试脚本模板模式和代码模式、测试场景配置、测试执行及执行数据实时展示,还有提供完善的性能结果报表和强大的性能分析图形展示。